package com.lz.common.baseBean;

import lombok.Data;

import java.util.Date;

@Data
public class R<T> {


    private boolean flag; // 是否成功
    private Integer code; // 返回码
    private String message; // 返回消息
    private transient T data; // 返回数据
    private String traceId;
    private Date createTime;


    // 私有构造器，防止外部 new 实例
    private R() {

    }

    private R(boolean flag, Integer code, String message, T data) {
        this.flag = flag;
        this.code = code;
        this.message = message;
        this.data = data;
    }

    /**
     * 构建通用响应对象
     */
    public static <T> R<T> of(boolean flag, Integer code, String message, T data) {
        return new R<>(flag, code, message, data);
    }

    /**
     * 成功响应（带数据）
     */
    public static <T> R<T> success(T data) {
        return new R<>(true, 200, Value.SUCCESS.toString(), data);
    }

    /**
     * 成功响应（无数据）
     */
    public static R<Void> success() {
        return new R<>(true, 200, Value.SUCCESS.toString(), null);
    }

    /**
     * 失败或成功响应（根据布尔值决定）
     */
    public static R<Void> ofSuccessOrFailure(boolean flag) {
        if (flag) {
            return new R<>(true, getOkCode(), Value.SUCCESS.toString(), null);
        } else {
            return new R<>(false, 20000, Value.ERROR.toString(), null);
        }
    }

    /**
     * 自定义失败响应
     */
    public static R error(String message) {
        return new R<>(false, 400, message, null);
    }

    /**
     * 自定义响应
     */
    public static <T> R<T> of(boolean flag, Integer code, String message) {
        return new R<>(flag, code, message, null);
    }

    public static Integer getOkCode() {
        return 10000;
    }

    @Override
    public String toString() {
        return "R{" +
                "flag=" + flag +
                ", code=" + code +
                ", message='" + message + '\'' +
                ", data=" + data +
                '}';
    }

    public void addTraceIdAndTime(String traceId, Date date) {
        this.traceId = traceId;
        this.createTime = date;
    }


}
